//配置路由
import Vue from "vue";
import VueRouter from "vue-router";

//使用插件
Vue.use(VueRouter);

//引入element组件

import { Message } from 'element-ui'

//引入路由相关的配置项
import routes from "@/router/routes";

//引入仓库
import store from "@/store";
import {removeToken} from "@/utils/token";
//把人家原型对象的push方法进行保存
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
    //当前函数this：即为VueRouter类的实例
    //相当于push方法里面this，是windows【完犊子了】
    //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

    //面试:函数apply与call区别?
    //相同的地方:都可以篡改函数里面this
    //不同的地方:apply传递参数 数组  call传递参数 逗号分割

    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}


VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}

//第二步:暴露VueRouter类的实例
//对外暴露一个路由器,实质是VueRouter类的实例,一个路由器可以管理多个路由
const router = new VueRouter({
    //配置路由
    routes,
});

//全局守卫，前置守卫（在路由跳转前进行判断）
router.beforeEach(async(to,from,next)=>{

    let token = store.state.user.token
    let userInfo = store.state.user.userInfo.id;
    //用户登录
    if (token) {
        //用户登录了,不能去login
        if (to.path == "/login") {
            document.title = '主页'
            next('/home');
        } else {
            //用户登陆了,而且还有用户信息【去的并非是login】
            if (userInfo) {
                if (!store.state.chat.webOpen){
                    // 开启webSocket
                    await store.dispatch('WebSocketComm');
                }
                await store.dispatch('UserSnapshotOne');
                document.title = to.meta.title || '找帮帮'
                next();
            } else {
                //用户登陆了，没有用户信息
                try {
                    //请求用户数据
                    await store.dispatch('ReqUserInfo');
                    if (!store.state.chat.webOpen){
                        // 开启webSocket
                        await store.dispatch('WebSocketComm');
                    }
                    document.title = to.meta.title || '找帮帮'
                    next();
                } catch (error) {
                    //获取用户信息失败
                    //token认证错误或者失效
                    console.log('获取用户信息失败')
                    //回到登录页，重新获取一个新的学生证
                    document.title = '登录'
                    await store.dispatch('Logout');
                    Message.error('身份信息过期，请重新登录！');
                    next('/login');
                }
            }
        }
    } else {
        //用户未登录||目前的判断都是放行.将来这里会'回手掏'增加一些判断
        //用户未登录:不能进入/trade、/pay、/paysuccess、/center、/center/myorder  /center/teamorder
        let toPath = to.path;
        if (toPath.indexOf('detail') != -1 || toPath.indexOf('addOrder') != -1 || toPath.indexOf('chat') != -1 || toPath.indexOf('myOrder') != -1 || toPath.indexOf('receive') != -1) {
            document.title = '登录'
            next('/login?redirect='+toPath);
            Message.error('请先登录！');
        } else {
            document.title = to.meta.title || '找帮帮'
            next();
        }
    }
})

export default router;
